#ifndef _LINKEDSTRING_
#define _LINKEDSTRING_

/**
 * 串 数据结构也可以使用链式储存结构, 我们可以根据情况来使用 单链表, 双向链表, 或者循环链表来实现串
 * 
 * 串的链式储存结构有两种方式:
 * 
 * 1. 单链表形式, 每个结点的数据域只保存一个 字符, 缺点是储存密度低(储存密度就是 数据域保存的实际的数据所占储存空间 / 整个结点所占储存空间)
 * 2. 块链形式, 也就是为了解决储存密度低的问题, 每个结点的数据域保存 多个字符(字符数组, 这个字符数组的长度可以为8的倍数, 因为指针域所占的储存空间为4或者8, 而数据域的字符数组为8的倍数时可以减少储存空间的浪费), 
 * 
 * 参考:
 * https://www.cnblogs.com/lcyxy/p/12675739.html
 * http://data.biancheng.net/view/178.html
 * https://blog.csdn.net/cbwem/article/details/78311960
 */

#define Status int
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define STUFF '#'

// 第一种形式: 结点的数据域为单个字符
// typedef struct Node {
//     char ch;
//     struct Node *next;
// } Node;

// 第二种形式: 结点的数据域为多个字符
#define CHARSIZE 8
typedef struct Node {
    char data[CHARSIZE];
    struct Node *next;
} Node;

// 块链
typedef struct {
    struct Node *head, *tail;
    int length;
} LinkedString;

// 初始化
Status InitString(LinkedString *pStr);

// 赋值
Status StrAssign(LinkedString *pStr, char *insertedStr);

// 是否为空
Status IsStrEmpty(LinkedString str);

// 取长度
unsigned int StrLength(LinkedString str);

// 复制
Status StrCopy(LinkedString *to, LinkedString from);

// 串的转换: 串的转换操作。将串S的内容转换为字符串，将串S中的字符拷贝到cstr。成功返回1，否则返回0
Status ToChars(LinkedString str, char **toStr);

// 串的比较
Status StrCompare(LinkedString str1, LinkedString str2);

// 串的链接
Status StrConcat(LinkedString *pStr, LinkedString str2);

// 串的插入
Status StrInsert(LinkedString *pStr, int pos, LinkedString insertedStr);

// 串的删除
Status StrDelete(LinkedString *pStr, int pos, int len);

// 取子串
Status SubString(LinkedString str, int pos, int len, LinkedString *subStr);
// 取子串第二种写法
Status SubString02(LinkedString str, int pos, int len, LinkedString *subStr);

// 清空串
Status ClearString(LinkedString *pStr);

#endif